2023 年 4 月 15 日发生的一起攻击事件,Hundred Finance 是部署在 Optimism 上的一个多链借款协议,在这次攻击中,它损失了约 $7 Million。
BTC 就是众所周知的比特币;而 WBTC 的全称是 Wrapped BTC,是在以太坊区块链上运行的,和 BTC 价格相同的虚拟货币。将 BTC 兑换为 WBTC 的过程中,需要将 BTC 锁定在比特币区块链上,并与一个受信任的第三方(如 BitGo)进行交易换取铸造的 WBTC。
ERC-20 是一个同质化代币标准,它具有一种属性:每个代币都与另一个代币(在类型和价值上)完全相同。ETH、USDT、BNB 等常见的虚拟货币都属于 ERC-20。ERC-20 的功能包括但不限于:
EIP 的全称是 Ethereum Improvement Proposal,是 Ethereum 的技术规范;而 ERC 是 Ethereum Request for Comments,它讨论的范围是“程序层级的标准和规范”,属于 EIP 中的一个项目。
Hundred Finance 是 Compound v2 的一个分支(fork)。
当代币被提供给 Hundred Finance 协议的各个市场时,相应的 hTOKENS 将被铸造并由供应商的钱包接收(例如 ETH 铸造 hETH)。这些 hTOKENS 是根据 ERC20 标准发行的用户存款的计息代币化代表。每当用户铸造、赎回、借入、偿还、清算账户或转移 hTOKENS 时,都是通过与相关 hTOKEN 合约的交互来完成的。
hWBTC 的全称为 Hundred WBTC,是 Hundred Finance 发行的一种代币,可与 WBTC 进行兑换。
Hundred Finance Attack 的主要问题出在,它在换算 redeemTokens 时,理论上 redeemTokens 的值应该是 2,实际计算出的 1.999999999960024 会被舍入到 1。这就导致了赎回金额的偏差(即便只是偏差了 1wei,但是在价格操控后的场景下,仍然十分有利可图)。
流动性越差的池子就越容易被价格操控。本次攻击事件发生的 hWBTC 池子,由于没有其他任何的交易者,导致攻击者可以在计算误差产生的 2wei hWBTC
上大做文章,通过借入 500 WBTC
导致了 hWBTC
在 Hundred Finance 中的极大汇率。
首先,Attack Account1 赎回池子中原有的 WBTC
攻击者创建新账号 Attack Account2,并通过先借入后赎回 4 WBTC
的操作,故意留下 2wei hWBTC
。
Attack Account2 随后借入 500.3 WBTC
以大幅提高 hWBTC 的汇率(价格操控)。
在赎回先前借入的 500.3 WBTC
时,由于舍入错误,原本要赎回的 2wei hWBTC
被向下取整到 1 wei,进而产生了 1wei hWBTC
的结余。
Attack Account2 利用这 1wei hWBTC
兑换了 1021.9 Ether
,即本次攻击的收益。
攻击者反复利用此方法攻击了 Hundred Finance 的若干池子,兑换了包括 USDT
、Ether
、USDC
在内的诸多代币。